﻿/*-------------------------------------------------------------------------
* 命名空间: XrayDirection.HelperManager/FileDirHelper
* 类       名: FileDirHelper
* 功      能:  TD
* 时      间:  2023/12/28 11:46:36
* 版      本:  V1.0
* 作      者:  Fioman
* 格      言:  Talk is cheap,show me the code ^_^
*-------------------------------------------------------------------------*/
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Security.AccessControl;
using XrayDirection.Services;

namespace XrayDirection.HelperManager
{
    public static class FileDirHelper
    {
        /// <summary>
        /// 打开指定的文件夹,并且选中指定的文件,如果没有指定文件,就默认显示最新创建的文件.
        /// 注意这里的文件的文件名只是文件名,不是全路径的文件名
        /// </summary>
        /// <param name="dirPath"></param>
        /// <param name="selectedFileName"></param>
        public static void OpenDirAndSelected(string dirPath, string? selectedFileName = null)
        {
            // 如果目录不存在就提示,然后返回
            if (!Directory.Exists(dirPath))
            {
                MessageProvider.ShowInfo($"要打开的目录 {dirPath} 不存在,请确认目录是否存在!", "目录错误提示框");
                return;
            }
            string filePathSelected;
            if (selectedFileName != null && File.Exists(Path.Combine(dirPath, selectedFileName)))
            {
                filePathSelected = Path.Combine(dirPath, selectedFileName);
            }
            else
            {
                FileInfo? lastestFile = new DirectoryInfo(dirPath).GetFiles()
                    .OrderByDescending(f => f.CreationTime)
                    .FirstOrDefault();
                if (lastestFile != null)
                {
                    filePathSelected = lastestFile.FullName;
                }
                else
                {
                    return;
                }
            }

            Process.Start("Explorer", $"/Select,\"{filePathSelected}\"");

        }

        // 更改文件夹的访问权限,可读可写
        public static void ChangeDirAccessEveryone(string dirPath)
        {
            // 获取目录的访问控制列表(ACL)
            DirectoryInfo di = Directory.CreateDirectory(dirPath);
            DirectorySecurity ds = di.GetAccessControl();
            // 添加访问规则: 为所有用户提供完全控制权限
            ds.AddAccessRule(new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, AccessControlType.Allow));
            // 将修改后的ACL应用于目录
            di.SetAccessControl(ds);
        }

        // 检查某个文件夹是否存在,如果不存在就创建
        public static void CreateDir(string dirPath)
        {
            if (!Directory.Exists(dirPath))
            {
                Directory.CreateDirectory(dirPath);
            }
        }

        // 获取文件夹中所有的文件名称,不包含全路径
        // 注意这里的fileFilter是一个搜索通配符,而不是以什么结尾,也不是正则表达式
        public static string[] GetTotalFiles(string dirPath, string fileFilter = "*.bmp")
        {
            return Directory.GetFiles(dirPath, fileFilter)
                .Select(fullPath => Path.GetFileName(fullPath)).ToArray();
        }

    }
}
